<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件间的通信-驼峰标识</title>
</head>

<body>
    <script src="/js/vue.js"></script>
    <div id="app">
        <!-- 父向子传递数据的时候通过 props  properties： 子组件通过props接收父组件传递的数据 父组件通v-bind 传递数据-->
        <!-- 子向父传递数据的时候通过 子组件创建自定义事件 通过 $emit函数 发射  父组件通过v-on监听事件，接收事件传递过来的数据  -->
        <!--  真实开发中 Vue实例与子组件通信和  父组件与子组件通信是一样的 -->
        <!-- <p>{{msg}}</p> -->

        <!-- 驼峰标识 因为vue 里面使用了html 属性，使用的是insensitive case， 如果想使用驼峰标识camelCased case，
             必须用kebab-case 代替实现--->
        <cpn v-bind:child-movies="movies" v-bind:child-msg="msg"></cpn>
    </div>

    <!-- 创建子组件模板 -->
    <template id="cpn1">
        <div>
            {{childMsg}}
            <ul>
                <li v-for="item in childMovies">{{item}}</li>
            </ul>
        </div>
    </template>

    <script>

        /* Array String  Number Boolean Object Function Date Symbol */

        class Button {

        }

        //创建子组件对象
        const cpn = {
            template: `#cpn1`,
            //1. props 用数组
            // props: ['childmovies','childmsg'], //长的像字符串，实际是一个变量
            //2. props 用对象
            props: {
                // 1) 可以验证数据类型，类型的限制 
                // childmovies: Array, 
                // 2) 可以限制多个
                // childmsg: [Array, String],
                // 3) 可以使用自定义
                // childmovies2:Button
                // 4) 对象语法
                childMsg: {
                    type: String, // 数据类型的限制
                    default: 'hello',// 默认值，如果父组件未向子组件传递数据时，显示
                    required: true,//是否必填
                },
                childMovies: {
                    type: [Array, Object],//当类型限制为数组或对象时候
                    default() {
                        return ['red', 'blue', 'yellow']
                    }
                }

            },
            data() {// 子组件保存数据
                return {}
            }
        }

        // 父组件
        let app = new Vue({
            el: "#app",
            data: {
                msg: 'hello world',
                movies: ['灌篮高手', '喜羊羊与灰太狼', '龙马精神']
            },
            // 注册子组件
            components: {
                cpn
            }
        })
    </script>
</body>

</html>